其他
拒绝接口裸奔!开放API接口签名验证!
请求身份是否合法? 请求参数是否被篡改? 请求是否唯一?
AccessKey&SecretKey (开放平台)
请求身份
防止篡改
按照请求参数名的字母升序排列非空请求参数(包含AccessKey),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA; 在stringA最后拼接上Secretkey得到字符串stringSignTemp; 对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。
重放攻击
实现
http://api.test.com/test?name=hello&home=world&work=java
生成当前时间戳timestamp=now和唯一随机字符串nonce=random 按照请求参数名的字母升序排列非空请求参数(包含AccessKey) stringA="AccessKey=access&home=world&name=hello&work=java×tamp=now&nonce=random";
拼接密钥SecretKey stringSignTemp="AccessKey=access&home=world&name=hello&work=java×tamp=now&nonce=random&SecretKey=secret";
MD5并转换为大写 sign=MD5(stringSignTemp).toUpperCase();
最终请求 http://api.test.com/test?name=hello&home=world&work=java×tamp=now&nonce=nonce&sign=sign;
Token&AppKey(APP)
Token身份验证
用户登录向服务器提供认证信息(如账号和密码),服务器验证成功后返回Token给客户端; 客户端将Token保存在本地,后续发起请求时,携带此Token; 服务器检查Token的有效性,有效则放行,无效(Token错误或过期)则拒绝。 安全隐患:Token被劫持,伪造请求和篡改参数。
Token+AppKey签名验证
实现
后续请求
和上述开放平台的客户端行为类似,把AccessKey改为token即可。
最后给大家送下福利,大家可以关注Java核心技术公众号,在后台回复 “福利”可以获取一份我整理的最新Java面试题资料。
(END)
最近好文分享
Java 的 main 方法是 public static void?
更多请扫码关注 • Java核心技术